package fr.adfm.service.implemenation;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import fr.adfm.dao.interfaces.IArticleVetementDao;
import fr.adfm.dao.interfaces.IBonCommandeDao;
import fr.adfm.dao.interfaces.IClientDao;
import fr.adfm.dto.AdresseDto;
import fr.adfm.dto.ArticleDto;
import fr.adfm.dto.ArticlePanierDto;
import fr.adfm.dto.BonCommandeDto;
import fr.adfm.dto.BonCommandeLigneDto;
import fr.adfm.dto.ClientDto;
import fr.adfm.dto.MemberDto;
import fr.adfm.dto.PanierDto;
import fr.adfm.dto.ProduitDto;
import fr.adfm.entity.Adresse;
import fr.adfm.entity.BonCommande;
import fr.adfm.entity.BonCommandeLigne;
import fr.adfm.entity.EtatTraitementBonCommande;
import fr.adfm.service.interfaces.IBonCommandeService;
import fr.adfm.service.interfaces.ILoginService;

@Component
public class BonCommandeService implements IBonCommandeService {
	@Autowired
	IBonCommandeDao commandeDao;
	
	@Autowired
	IClientDao clientDao;
	
	@Autowired
	IArticleVetementDao articleVetementDao;

	@Override
	public BonCommandeDto CreateBonCommande(MemberDto client, PanierDto panier,
			AdresseDto adresseLivraisonDto, Double fraisDePort) {
		
		BonCommande bonCommande = new BonCommande();
		bonCommande.setClient(clientDao.find(client.getMembreId()));
		bonCommande.setDateCreation(new Date());
		bonCommande.setMontantTotal(panier.getPrix() + fraisDePort);
		bonCommande.setFraisDePort(fraisDePort);
		
		Adresse adresseLivraison = new Adresse();
		BeanUtils.copyProperties(adresseLivraisonDto, adresseLivraison);
		bonCommande.setAdresseLivraison(adresseLivraison);
		
		EtatTraitementBonCommande etatTraitementBonCommande = new EtatTraitementBonCommande();
		etatTraitementBonCommande.setEtatInitial();
		bonCommande.setEtatTraitementBonCommande(etatTraitementBonCommande);
		
			
		List<BonCommandeLigne> bcLignes = new ArrayList<BonCommandeLigne>();	
		bonCommande.setLignes(bcLignes);
		for(ArticlePanierDto article : panier.getArticles()) {
			BonCommandeLigne bcLigne = new BonCommandeLigne();
			bcLigne.setArticle(articleVetementDao.find(article.getId()));
			bcLigne.setBonCommande(bonCommande);
			bcLigne.setPrixUnitaire(article.getPrixUnitaire());
			bcLigne.setQuantite(article.getQuantiteDesiree());
			bcLignes.add(bcLigne);
		}
		
		commandeDao.save(bonCommande);
		
		BonCommandeDto bonCommandeDto = getBonCommande(bonCommande.getId());
		return bonCommandeDto;
	}

	@Override
	public BonCommandeDto getBonCommande(Long idBonCommande) {
		BonCommandeDto bcDto = new BonCommandeDto();
		try{
			BonCommande bc = commandeDao.find(idBonCommande);
			if (bc != null)
			{
			BeanUtils.copyProperties(bc,  bcDto);
			bcDto.setClient(new ClientDto());
			BeanUtils.copyProperties(bc.getClient(),  bcDto.getClient());
			bcDto.setAdresseLivraison(new AdresseDto());
			BeanUtils.copyProperties(bc.getAdresseLivraison(),  bcDto.getAdresseLivraison());
			
			bcDto.setLignes(new ArrayList<BonCommandeLigneDto>());
			List<BonCommandeLigne> lignes = (List<BonCommandeLigne>) bc.getLignes();
			for(BonCommandeLigne bcl : lignes) {
				BonCommandeLigneDto bclDto = new BonCommandeLigneDto();
				BeanUtils.copyProperties(bcl,  bclDto);
				bcDto.getLignes().add(bclDto);
				
				ArticleDto articleDto = new ArticleDto() {};
				BeanUtils.copyProperties(bcl.getArticle(),  articleDto);
				bclDto.setArticleDto(articleDto);
				articleDto.setProduitDto(new ProduitDto());
				BeanUtils.copyProperties(bcl.getArticle().getProduit(), articleDto.getProduitDto());
			}
			}
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
		return bcDto;
	}


	
	

}
